from datetime import datetime
from flask import Blueprint, json,request,jsonify #导入蓝图

from db import db1 #导入pymysql


bp_course= Blueprint('course',__name__)#实例化蓝图 


#构造数据结构
def xtree(data):
    #看data有没有，没有直接返回
    if not data:
        return data
    #先循环把data变成字典
    tree={}
    list=[]
    for i in data:
        #把id作为键data作为值
        tree[i['id']]=i
        list.append(tree)
        
    for j in data:
        #获取父id
        pid=j['pid']
        #判断是否为顶级父类
        if pid==0:
            #是顶级父类就直接加到列表里
            list.append(j)
    
            
        else:
            #查看父类下有没有子类
            if 'son' not in tree[pid]:
                #如果子类下没有父类就创建一个空列表来盛放子类
                tree[pid]['son']=[]
            #把子类加到列表中
            tree[pid]['son'].append(j)
    return list

@bp_course.route('/cateM',methods=['POST','GET'])
def method_name():
    if request.method=='POST':
        #获取前端传递的数据
        data=request.data
        if data:
            data=json.loads(data)
        else:
            data=request.form
        # 将数据添加到数据库中
        sql="insert into cates values(0,'%s',%d,'%s')"%(data['name'],int(data['pid']),data['params'])
        db1.update(sql)
        #返回
        return jsonify({'code':200})
    elif request.method=='GET':
        #获取分类表所有信息
        sql="select * from cates"
        res=db1.findall(sql)

        data=xtree(res)


        #返回
        return jsonify({'code':200,'list':data})

@bp_course.route('/pagecates')
def pagecates():
    #每页显示多少条
    page_size=2
    #当前页
    page=request.args.get('page')
    #计算页面开始位置
    start=(int(page)-1)*page_size
    #获取分类表所有信息根据id降序排序          limit后面跟开始页和每页显示多少条
    sql="select * from cates order by id asc limit %d,%d"%(start,page_size)
    # sql = "select c.name,c.params,t.name as tname from cates as c left join cates as t on c.pid=t.id order by c.id desc"
    res=db1.findall(sql)
    #通过id查询共有多少条记录
    sql1="select count(id) as total from cates"
    res1=db1.find(sql1)
    return jsonify({'code':200,'list':res,'total':res1['total']})


# 根据id查询分类表中的字段
@bp_course.route('/getCateByid')
def getCateByid():
    #获取前端传递的id
    id=request.args.get('id')
    #通过id去数据库中查询params(参数)字段
    sql="select params from cates where id=%d"%(int(id))
    res=db1.find(sql)
    #返回
    return jsonify({'code':200,'params':res['params']})



#添加课程接口
@bp_course.route('/courseM',methods=['POST','GET'])
def courseM():
    if request.method=='POST':
        #获取data
        data=request.data
        if data:
            data=json.loads(data)
        else:
            data=request.form
        if data['params']:
            sql="insert into courses values(0,'%s',%d,'%s','%s','%s',%d,%d)"%(data['title'],int(data['pid']),data['params'],data['pic'],data['descrip'],int(data['teacher_id']),int(data['status']))
        else:
            sql="insert into courses(title,pid,pic,descrip,teacher_id,status) values('%s','%d','%s','%s','%d','%d')"%(data['title'],int(data['pid']),data['pic'],data['descrip'],int(data['teacher_id']),int(data['status']))
        db1.update(sql)
        return jsonify({'code':200})
    elif request.method=='GET':
        #分页获取所有数据
        #获取当前页
        page=request.args.get('page')
        #定义每页显示多少条
        page_size=2
        
        #构造sql 连表查询 左连(左连,左边的是主表) 课程表是主表 分类表是从表 
        
        #判断是否有当前页
        if page:
            #计算开始下标 公式:当前页-1*每页显示多少条
            start=(int(page)-1)*page_size
            sql="select c.title,c.pic,ca.name from courses as c left join cates as ca on c.pid=ca.id limit %d,%d"%(start,page_size)
        else:
            sql="select * from courses"
            
        res=db1.findall(sql)
        #查询共有多少条
        sql1="select count(id) as count from courses"
        total=db1.find(sql1)
        #返回
        return jsonify({'code':200,'list':res,'total':total['count']})

        # sql="select c.title,c.pic,ca.name from courses as c left join cates as ca on c.pid=ca.id"
        # res=db1.findall(sql)
        # return jsonify({'code':200,'list':res})

#用七牛云上传图片
# 导入配置文件
from utils.comm import getQNToken

@bp_course.route('/getToken')
def getToken():
    token=getQNToken()
    return jsonify({'code':200,'token':token})

#导入文件操作模块 os模块
import os

#上传视频
@bp_course.route('/vedioUpload',methods=['POST'])
def vedioUpload():
    #获取文件流和课程id
    file=request.files['file']
    course_id=request.form['course_id']
    #查看文件夹是否存在
    path='./static/upload/'+str(course_id)
    #不存在创建
    if not os.path.exists(path):
        os.mkdir(path)
    #直接上传
    file.save(os.path.join(path,file.filename))
    #返回
    return jsonify({'code':200,'url':'/static/upload/'+str(course_id)+'/'+file.filename})

#添加章节接口
@bp_course.route('/zjieM',methods=['POST','GET'])
def zjieM():
    if request.method=='POST':
        #获取data
        data=request.data
        if data:
            data=json.loads(data)
        else:
            data=request.form
        sql="insert into section values(0,'%s',%d,'%s')"%(data['name'],int(data['course_id']),data['video_url'])
        db1.update(sql)
        return jsonify({"code":200})
    else:
        #获取章节列表必须传入课程id
        course_id = request.args.get('cid')
        if not course_id:
            return jsonify({"code":10010,'mes':'必须传入课程id才能获取章节信息'})
        sql = "select * from jie where course_id=%d order by sort asc"%(int(course_id))
        res = db1.find_all(sql)
        return jsonify({"code":200,'list':res})


    
#测试记录表操作
@bp_course.route('/sendmoney',methods=['POST','GET'])
def sendmoney():
    if request.method=='POST':
        #获取data
        data=request.data
        if data:
            data=json.loads(data)
        else:
            data=request.form
    sql="insert into test_record(name,url,methods,params,result) values('%s','%s','%s',%s,'%s')"%(data['name'],data['url'],data['methods'],data['params'],data['result'])
    db1.insert(sql)
    #返回
    return jsonify({'code':200})






#读取表测试及生成报告
import requests
#导入时间模块
import datetime
#导入文件操作模块
import os
@bp_course.route('/test_sendMoney')
def test_sendMoney():
    #读取数据库  查询所有状态为1的数据  状态为1代表没有经过处理的文件
    sql="select * from test_record where status=1"
    #查所有
    res=db1.findall(sql)
    #定义一个空列表
    list=[]
    #循环查出来的结果 i代表每一条
    for i in res:
        #定义一个代表结果的变量 flag  定一个初始值为flag
        flag="失败"
        #参数 用json.loads转一下
        params=json.loads(i['params'])
        #如果请求方式为get
        if i['methods']=="get":
         #返回结果= 向接口发起get请求 请求地址  请求参数
            mes=requests.get(i['url'],params=params)
        # 如果请求方式为post
        elif i['methods']=='post':
            #   向接口发起post请求  请求地址 获取参数
            mes=requests.post(i['url'],data=params)
        #将返回的结果转为json格式
        mm=json.loads(mes.text)
        #如果返回的code码=预期解雇
        if mm['code']==int(i['result']):
            #flag变为成功
            flag='成功'
        #将数据放到str里
        str={"name":i['name'],"请求地址":i['url'],"返回信息":mes.text,"测试结果":flag}
        #将数据添加到列表里
        list.append(str)
        #文件名=当前时间
        filename=datetime.datetime.strftime(datetime.datetime.now(),'%Y%m%d')
        #打开文件   写入文件
        with open(os.path.join('../logs/'+filename+'.txt'),'w',encoding='utf8') as f:
            f.write(json.dumps(list,ensure_ascii=False))

    return jsonify({'code':200})






#导入正则模块
import re
#导入时间模块
import time
#导入随机数模块
import random


#发送验证码
@bp_course.route('/sendSms',methods=['POST','GET'])
def sendSms():
    #获取手机号
    if request.method=='POST':
        #获取data
        data=request.data
        if data:
            data=json.loads(data)
        else:
            data=request.form
    
    mobile=data['mobile']
    if not mobile:
        return jsonify({'code':10011,'mes':'不能为空'})

    #验证手机号是否合法
    res=re.match('^1[3-9]\d{9}$',mobile)
    if not res:
        return jsonify({'code':10010,'mes':'手机号不合法'})

    #检查上次发送是否超过一分钟，1分钟内不能发
    sql="select stime from jilu where mobile='%s' order by id desc limit 1"%(str(mobile))
    record=db1.find(sql)
    if record:
        #判断时间是否在一分钟以内
        seconds=int(time.time())-int(record['stime'])
        if seconds<60:
            return jsonify({'code':10012,'mes':'一分钟内不能重复发送'})
    
    #生成验证码发送
    code=random.randint(100000,999999)
    #当发送成功写入记录
    sql2="insert into jilu(mobile,code,stime) values('%s',%d,%d)"%(str(mobile),code,int(time.time()))
    db1.insert(sql2)
    #返回结果
    return jsonify({'code':200,'mes':'发送成功','codesms':code})



#手机号登录
@bp_course.route('/tlogin',methods=['POST'])
def tlogin():
    #获取手机号,验证码
    if request.method=='POST':
        #获取data
        data=request.data
        if data:
            data=json.loads(data)
        else:
            data=request.form
    #通过手机号去记录表中查询,查最近的一条
    sql="select code,stime from jilu where mobile='%s' order by id desc limit 0,1"%(data['mobile'])
    res=db1.find(sql)
    if not res:
        return jsonify({'code':10060,'mes':'手机号有误'})
    #验证码过期时间验证 用现在时间减去开始时间 来判断是否大于一分钟
    t = int(time.time())-res['stime']
    if t>60:
        return jsonify({'code':10020,'mes':'验证码已过期请重试'})
    #验证码是否相同
    print(type(res['code']))
    print(type(data['code']))
    if res['code']==int(data['code']):
        #用户表中查询手机号是否存在
        sql1="select id from jilu where mobile='%s'"%(data['mobile'])
        user=db1.find(sql1)
        #存在返回登录成功userid
        if user:
            return jsonify({'code':200,'userid':user['id'],'mes':'登录成功'})
        #不存在添加新用户返回userid
        sql2="insert into jilu(mobile) values('%s')"%(data['mobile'])
        db1.insert(sql2)
        sql3="select id from jilu where mobile='%s'"%(data['mobile'])
        user3=db1.find(sql3)
        return jsonify({'code':200,'userid':user3['id'],'mes':'登录成功'})
    else:
        return jsonify({'code':10021,'mes':'验证码输入错误'})








#商品表操作
#搜索
@bp_course.route('/search')
def search():
    #获取前端传递的title
    title=request.args.get('title')
    #判断是否为空去掉空格
    title=title.strip()
    if not title:
        return jsonify({'code':10030,'mes':'搜索内容不能为空'})
    #判断长度 5-10
    if 1<=len(title)<=10:
        #数据库查询
        sql="select * from Xshops where title like '%"+title+"%'"
        print(sql)
        res=db1.findall(sql)
        #写入记录表
        ip=request.remote_addr
        sql2="insert into liulan(title,ip) values('%s','%s')"%(title,ip)
        db1.insert(sql2)
        return jsonify({'code':200,'list':res})
    else:
        return jsonify({'code':10031,'mes':'长度不合法'})







#商品表展示
@bp_course.route('/getgoodM')
def getgoodM():
    #构造sql语句
    sql="select * from Xgoods"
    res=db1.findall(sql)
    #返回
    return jsonify({'code':200,'list':res})